requirejs.config({
    baseUrl: '../js/libs',
    paths: {
        popover: '../plugins/popover/jquery.webui-popover.min',
    },
    shim: { //引入没有使用requirejs模块写法的类库。backbone依赖underscore
        'jquery': {
            exports: '$'
        },
        'popover':['css!../plugins/popover/jquery.webui-popover.min.css']

    }
});
define(['jquery','popover'],function($){
	var proverEnable=function(params){
 		var p = this,defaults = {
 			title:'这是标题名称',
			placement:"auto",// auto,top,right,bottom,left,top-right,top-left,bottom-right,bottom-left,auto-top,auto-right,auto-bottom,auto-left,horizontal,vertical
			containerClass:"customProver",//prover 最外层加样式 默认：customProver
			ListULClass:['firstSeclect','secondSelect'],//UL队列的 className
		    data: null,            // 数组列表
		    arrDefaultValues:null,  //默认筛选的数组 只能是筛选 level_type 和 pId 两个字段,其格式是[{"level_type":1,"pId":0},{"level_type":"2","pId":"10002"}]
            destroy:false,//true 为销毁后再进行绑定
            async: {
                type: 'GET',
                before: null, //function(that, xhr){}
                success: null, //function(that, xhr){}
                error: null //function(that, xhr, data){}
            },
            multi: false,
            allLeavel:null,//总的级数,为正整型
            url: '',
            arrow:true,//show arrow or not
            closeable:true,
            cache:false,//if cache is set to false,popover will destroy and recreate
            type:'html',//content type, values:'html','iframe','async'
			backdrop:false,//if backdrop is set to true, popover 将会以遮罩层形式打开
		    groupBtn:true, //底部按钮确定 和取消是否现实；默认值 true 为现实
			loadingHtml:'<div class="editableform-loading"></div>',	//加载模板	
			buttonsHtml:'<button type="button" class="btn btn-primary popoverSubmit mr10"><i class="icon-ok icon-white" >确定</i></button>'+
    					'<button type="button" class="btn popoverCancel"><i class="icon-remove">取消</i></button>',//按钮Html
    		containerHtml:null,//自定义内容HTML

    		shownPopoverFn:null,//弹出框显示出来以后执行函数shownPopoverFn; eg:function(p,obj,Opopover){},其中p: 是该插件所有的方法,obj:点击对象,Opopover:弹出框对象
    		hidePopoverFn:null,//弹出框显示出来以后执行函数shownPopoverFn; eg:function(p,obj,Opopover){},其中p: 是该插件所有的方法,obj:点击对象,Opopover:弹出框对象

    		SubmitFn:null,//当前框必须有.popoverSubmit 的提交按钮;SubmitFn必须是一个函数方法;才会执行SubmitFn;eg:function(p,obj,Opopover){}其中p: 是该插件所有的方法,obj:点击对象,Opopover:弹出框对象;返回真的时候,会关闭当前弹出层;
    		oLiClick:null,//如果是分类的时候,会暴露出oLiClick, eg:function(p,contentObj,$this,curData,nexTemArr1)其中：p: 是该插件所有的方法;contentObj:弹出框下的.categoryCon对象;$this:当前点击a的对象;curData:a上的当前数据,nexTemArr1:下一级数据
    		CancelFn:null,//当前框必须有.popoverCancel 的取消按钮;CancelFn必须是一个函数方法;才会执行CancelFn;eg:function(p,obj,Opopover){}其中p: 是该插件所有的方法,obj:点击对象,Opopover:弹出框对象;返回真的时候,会关闭当前弹出层;
 		};
 		p.params=$.extend(defaults,params);
 		p.params.newData=p.params.data;
 		/**
 		 * 单个筛选数组
 		 * p.filterArrSub 只允许过滤 level_type 和 pId 两个字段
 		 * expression=[{"level_type":'1'},{"pId":"10001"}]
 		 * 返回数组
 		 */
	    p.filterArrSub=function (data,name,value){
	      var _value=value.toString(),_name=name,_data=data;
	      var _tempArr=[];
	        $.each(_data,function(index,item){
	          $.each(item,function(index1,itemObj){
	            if(index1==_name && itemObj==_value){
	              _tempArr.push(_data[index])
	              //return _data[index]
	            }
	          })
	        })
	      return _tempArr; 
	    }
	    //json 数据格式比对
	    //
		// {checked:true,id:10003,level_type:2,name:"二级名字3",pId:10001,value:"33"}
	    p.compareJson=function(json1,json2){
			for(key in json1){
				if(json1[key]!=json2[key]){
					return false;
				}
			}
			return true;
	    }
	    //两个数组比对
	    p.compareArr=function(arr1,arr2) {
	    	var arr=[],flag=true;
	    	for(var i=0;i<arr1.length;i++){
	    		for(var j=0;j<arr2.length;j++){
	    			flag=p.compareJson(arr2[j],arr1[i]);
	    			if(flag){
	    				arr.push(arr2[j]);
	    			}
	    		}
	    	}
	    	return arr;
	    }
 		//筛选数据,返回二数组
 		//eg:[[{"level_type":'1',"name":"test"},{"level_type":'1',"name":"test"}],[{"level_type":'2',"name":"test"},{"level_type":'2',"name":"test"}]]
		p.filterArr=function(data,expression){
	       // var expression=[{"level_type":'1'},{"pId":"10001"}]
	       // var expression=[{"level_type":'1'},{"level_type":"2","pId":"10002"}]
	        var filterArr=[];
	        for(var i=0;i<expression.length;i++){
	        	var temp1={};
		    	if(expression[i].level_type){
		    		temp1.level_type=p.filterArrSub(data,"level_type",expression[i].level_type);
		    	}
		    	if(expression[i].pId){
		    		temp1.pId=p.filterArrSub(data,"pId",expression[i].pId);
		    	}
		    	if(temp1.level_type && temp1.pId){
		    		filterArr.push(p.compareArr(temp1.level_type,temp1.pId))
		    	}else if(temp1.level_type){
		    		filterArr.push(temp1.level_type);
		    	}else{
		    		filterArr.push(temp1.pId);
		    	}
		    	temp1={};
	        }
	    	return filterArr;
	    }
	    //渲染数据li结构p.params.arrDefaultValues
	    p.renderLiHtml=function(data){
    		var LiHtml=''
    		for(var i=0;i<data.length;i++){
    			var _level_type=data[i].level_type,_pId=data[i].pId,_id=data[i].id,_name=data[i].name,_checked=data[i].checked,_value=data[i].value;
    			if(_checked==true){
    				LiHtml+='<li class="on"><a href="javascript:void(0);"'
    			}else{
    				LiHtml+='<li><a href="javascript:void(0)"'
    			}
    			LiHtml+='data-level-type="'+_level_type+'"  data-id="'+_id+'" data-pId="'+_pId+'" data-value="'+_value+'">'+_name+'</a></li>'
    		}
    		return LiHtml;
	    }
	    p.levelTypeLen=function(arr){
	    	var max=0;
		    	for(var i=0;i<arr.length;i++){
		    		var tempLevel=parseInt(arr[i].level_type)
		    		if( tempLevel > max){
		    			max=tempLevel;
		    		}
		    	}
	    	return max
	    }

	    /**
	     * [renderUlHtml 渲染UL结构 ]
	     * @param  {[type=arr]} oULList [初始设置 ul的个数 p.params.ListULClass]
	     * @param  {[type=arr]} oLIList [筛选 渲染li出来的数据]
	     * @return {[type]}         [description]
	     */
	    
	    p.renderUlHtml=function(oULList,oLIList){
	    	var ulHtml='';
			if(p.params.allLeavel!=null && p.params.allLeavel.length>0){

			}else{
				p.params.allLeavel=p.levelTypeLen(p.params.newData);
			}
			if (p.params.allLeavel) {
				for(var i=0;i<p.params.allLeavel;i++){
		    		if(oULList[i]!=null && oULList[i].length>0){
		    			if(oLIList[i]!=null && oLIList[i].length>0){
		    				ulHtml+='<ul class="categoryUl '+oULList[i]+'">'
		    				ulHtml+=p.renderLiHtml(oLIList[i]);	
		    			}else{
		    				ulHtml+='<ul class="categoryUl '+oULList[i]+'" style="display:none;">'
		    			}
		    		}else{
		    			if(oLIList[i]!=null && oLIList[i].length>0){
		    				ulHtml+='<ul class="categoryUl">'
		    				ulHtml+=p.renderLiHtml(oLIList[i]);
		    			}else{
		    				ulHtml+='<ul class="categoryUl" style="display:none;">'	
		    			}
		    		}

		    		ulHtml+='</ul>'
				}	
			};
	    	
	    	return ulHtml;
	    }
	    //点击li下的a事件
	    p.liClickFn=function(obj){
	    	var _obj=obj.find(".categoryCon");
	    	_obj.on("click","ul li a",function(){
	    		var $this=$(this);
	    		var _levelType=$this.data("level-type"),_value=$this.data("value"),_pId=$this.data("pid"),_name=$this.text(),_id=$this.data("id");
	    			var oLi=$this.parent("li");
	    				oLi.addClass("on").siblings().removeClass("on");
	    			//	var len=p.levelTypeLen(p.params.newData);
	    			//	p.params.allLeavel
		    		var odata={},arr1=[],arr=[];
		    			odata.level_type=_levelType;
		    			odata.value=_value;
		    			odata.pId=_pId;
		    			odata.id=_id;
		    			odata.name=_name;
	    			var nexTemArr1=p.filterArr(p.params.newData,[{"level_type":_levelType+1,"pId":_id}]);
	    			_obj.find("ul").each(function(index,item){
	    				//点击当前 下下级隐藏
	    				if(index > _levelType){
	    					$(this).html('').hide();
	    					
	    				}
			    		// 
		           		// var allWidth=len*188;
	    				//点击当前 下级显示
	    				if(index== _levelType){
	    					for(var i=0;i<nexTemArr1.length;i++){
	    						if(nexTemArr1[i] && nexTemArr1[i].length >0){
	    							var LiHTML='';
		    						LiHTML+=p.renderLiHtml(nexTemArr1[i]);
		    						$(this).html(LiHTML).show().find("li").removeClass("on");
	    						}else{
	    							$(this).html('').hide();
	    						}

	    					}
							
	    				}
	    			});
	    			var conWidth=(_levelType+1)*200;
	    			if(conWidth>400){
	    				$this.parents(".categoryCon").css("width",conWidth);
	    			}
    				if(p.params.oLiClick!=null){
    					p.params.oLiClick(p,_obj,$this,odata,nexTemArr1)
    				}
	    	})
	    }
 		//渲染分类Html结构
 		p.renderCateMainHtml=function(){
            if(p.params.containerHtml!=null){
               var MainTmpHtml=p.params.containerHtml;
            }else{
            	// var len=p.levelTypeLen(p.params.newData);
           		// var allWidth=len*188;
    			var InitDataArr=p.filterArr(p.params.newData,p.params.arrDefaultValues);
     			var MainTmpHtml='<div class="categoryWrap" style="min-width:400px;max-width:570px;overflow:auto;"><div class="categoryCon">';
    				MainTmpHtml+=p.renderUlHtml(p.params.ListULClass,InitDataArr)
                    MainTmpHtml+='</div></div>'
                    if(p.params.groupBtn){
                    	MainTmpHtml+=p.params.buttonsHtml;
                    }
                    //console.log(MainTmpHtml)
               
            }
 			return MainTmpHtml;
 		}
 		//弹出层要隐藏的时候 其中：obj 点击的对象
 		p.hidePopover=function(obj){

 			obj.on('hide.bs.popover', function () {
 				if(p.params.hidePopoverFn!=null && typeof p.params.hidePopoverFn == 'function'){
				    var idName=$(this).attr("aria-describedby");
	 				var Opopover=$("#"+idName);
 					p.params.hidePopoverFn(p,obj,Opopover)
 				}
			})
 		}
 		p.onHide=function($element){
			if(p.params.hidePopoverFn!=null && typeof p.params.hidePopoverFn == 'function'){
				p.params.hidePopoverFn(p,params.container,$element);
			} 
 		}
 		//弹出层显示完成的时候 其中：obj 点击的对象
 		p.onShow=function($element){
			$element.addClass(p.params.containerClass);
				//自定义containerHtml 的时候
            if(p.params.containerHtml !=null){

            }else{
            	//li的点击事件
 				p.liClickFn($element);
            }
            var obj;
            params.container.each(function(){
            	if($(this).data("target")===$element[0].id || $(this).attr("data-target")===$element[0].id){
            		obj=$(this);
            	}
            	
            })
			if(p.params.shownPopoverFn!=null && typeof p.params.shownPopoverFn == 'function'){
				p.params.shownPopoverFn(p,obj,$element)
			} 
			var _popoverSubmit=$element.find(".popoverSubmit"),_popoverCancel=$element.find(".popoverCancel");
			//提交按钮
			if(p.params.SubmitFn!= null && typeof p.params.SubmitFn == 'function' && _popoverSubmit  &&_popoverSubmit.length > 0 ){
					_popoverSubmit.off("click").on("click",function(){
						var flag=p.params.SubmitFn(p,obj,$element);
						if(flag){
							if(p.params.cache){
								$element.hide();
							}else{
								$element.remove();	
							}	
						}
					})
			}
			//取消按钮
			if(p.params.CancelFn!= null && typeof p.params.CancelFn == 'function' && _popoverCancel  &&_popoverCancel.length > 0 ){
				_popoverCancel.off("click").on('click',function(){
					var flag=p.params.CancelFn(p,obj,$element);
					if(flag){
						if(p.params.cache){
							$element.hide();
						}else{
							$element.remove();	
						}	
						//WebuiPopovers.hide($element);
					}
				})	
			}
 		}
 		//设置弹出框
 		p.popoverModle=function(params){
 			var tempContainHtml;
 			if(params.containerHtml!=null&& params.containerHtml.length>0&& typeof params.containerHtml!="function"){
 				var temHtml='<div class="popoverFarmCon">';
 					temHtml+=params.containerHtml;
 				if(params.groupBtn){//判断是否显示按钮
 					temHtml+='<div class="hr-line-dashed"></div><div class="div-goup">';
 					temHtml+=params.buttonsHtml;
 					temHtml+='</div></div>'
	 			}else{
	 				temHtml+='</div>'
	 			}
	 			tempContainHtml=temHtml;
 			}else if(typeof params.containerHtml=="function"){
 				tempContainHtml=params.containerHtml;
 			}else{
 				tempContainHtml=p.renderCateMainHtml();
 			}
 			if (params.destroy) {
	               	   params.container.webuiPopover("destroy");
	            	};
			params.container.webuiPopover({
				title:params.title,
				html:params.html,
				placement:params.placement,
				content:tempContainHtml,
				onShow:p.onShow,
				onHide:p.onHide,
	            async:params.async,
	            multi: params.multi,
	            url:params.url,
	            arrow:params.arrow,
	            closeable:params.closeable,
	            type:params.type,
	            backdrop:params.backdrop,
	            cache:params.cache,
			})
 		};
 		//初始化执行
 		p.init=function(){
 			p.popoverModle(p.params);
 		}
 		p.init();
	};
	//初始化编辑
	$.fn.proverEnable=function(params){
		return this.each(function() {
            var $this = $(this);
            if(!$this[0]) return;
            var p = {};
            // if($this[0].tagName.toUpperCase() === "INPUT") {
            //     p.input = $this;
            // } else {
            //     p.container = $this;
            // }
            p.container = $this;
           	new proverEnable($.extend(p,params));
        });   		
	}
})